// 基于axios封装,网络请求的函数
import axios from 'axios'
// 引入token
import store from '@/store/index'
// 引入路由(为了token失效跳转到登录页面)
import router from '@/router/index'
// 引入element-ui(为了作一个token失效的提示)
import { Message } from 'element-ui'

export const baseURL = 'http://big-event-vue-api-t.itheima.net' // 接口和图片资源所在的服务器地址
// 创建一个自定的axios方法(比原axios多了个基地址)
// axios函数请求的url地址前面会被拼接基地址, 然后axios请求baseURL+url后台完整地址
const myAxios = axios.create({
  // 指定请求的根路径
  baseURL
})
// 1.定义请求拦截器(api每次调用request都会先走这个请求拦截器)
myAxios.interceptors.request.use(
  function (config) {
    // 在请求前触发一次
    // 返回给axios源码,config配置对象(要请求后台的参数都在这个对象上)
    // 为请求头挂载 Authorization 字段(但还需要作判断:登录和注册里面,vuex无token,且登录和注册不需要携带token)
    if (store.state.token) {
      config.headers.Authorization = store.state.token
    }
    // console.log(config)
    return config
  },
  function (error) {
    // 请求发起前的代码,如果有异常报错,会直接进入此处
    // 返回一个拒接状态的Promise对象(axios留在原地的Promise状态就为失败的结果为error变量值)
    // 类似catch()函数里面的return
    // 口诀:return非Promise对象,会作为成功的结果,返回给下一个Promise对象(axios留在原地)
    // 口诀:returnPromise对象,这个Promise对象状态,返回给下一个Promise对象
    // Promise.reject()原地留下一个新的Promise对象(状态为失败) 是类方法reject()
    return Promise.reject(error)
    // 等同于:
    // return new Promise((resolve,reject) => {
    //   reject(error)
    // })
  }
)
// 2.定义响应拦截器
myAxios.interceptors.response.use(
  function (response) {
    // 响应状态码为 2xx或3xx 时触发成功的回调,形参中的 response 是“成功的结果”
    // return 到axios原地Promise对象,作为成功的结果
    return response
  },
  function (error) {
    // 错误对象必须用console.dir(error)打印,用console.log()打印不出的
    // console.dir(error)
    // console.log(error)
    // 响应状态码是 4xx或5xx 时触发失败的回调,形参中的 error 是“失败的结果”
    // return 到axios原地Promise对象,作为失败拒绝的状态(如果那边用try+catch或者catch函数捕获,可以捕获到我们传递的error变量的值)
    // 登录过期---》被动退出登录的状态
    if (error.response.status === 401) {
      // 本次响应是token过期了(我们需要做的:1.代码方面是:清除vuex的token和用户信息,跳转到登录页面。2.提示用户token失效,需要他重新登录)
      // 1.清除vuex的token和用户信息
      store.commit('updateToken', '')
      store.commit('updateUserInfo', {})
      // 2.提示用户
      Message({
        message: 'Token已失效,请重新登录!',
        type: 'error',
        duration: 3000
      })
      // 3.跳转到登录页面
      router.push('/login')
    }
    return Promise.reject(error)
  }
)
// 导出自定义的axios方法, 供外面调用传参发请求
export default myAxios
